home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / glammar / ge10.c < prev    next >
C/C++ Source or Header  |  1991-01-21  |  5KB  |  236 lines

  1. /*
  2.  
  3.     This file is a part of the GLAMMAR source distribution 
  4.     and therefore subjected to the copy notice below. 
  5.     
  6.     Copyright (C) 1989,1990  Eric Voss, ericv@cs.kun.nl 
  7.  
  8.     This program is free software; you can redistribute it and/or modify
  9.     it under the terms of the GNU General Public License as published by
  10.     the Free Software Foundation version 1
  11.  
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. #include "ge1.h"
  22.  
  23. #ifdef DUNIXCON 
  24. #define MAX_CON 32
  25.   int talkto();
  26.  
  27. FILE *Unix_in[MAX_CON],*Unix_out[MAX_CON];
  28.  
  29. int    UnixConnectionSetUp[32]=  { 
  30.         false, false,false ,false,false,false,false,false,
  31.         false, false,false ,false,false,false,false,false,
  32.         false, false,false ,false,false,false,false,false,
  33.         false, false,false ,false,false,false,false,false,
  34. };
  35.  
  36. int connection_count = 0;
  37.  
  38. #define EVAL(a,b)   b = c;\
  39.                         sprinta (a);\
  40.                         *c++ = '\0';
  41.  
  42.  
  43.  
  44. int dsetupconnectiontounix(B,C)    /* setupconnectiontounix */
  45. register AFFIX B,C ;
  46. {
  47.     char    *A;
  48.     if (connection_count < 31) {
  49.       EVAL(B, A);
  50.       if (!talkto(A))
  51.          return false;
  52.       UnixConnectionSetUp[connection_count] = true;
  53.        
  54.       C ->t = c; 
  55.       (void)  sprintf(c, "%d\0", connection_count++);
  56.       c += 4;
  57.       
  58.       return true;
  59.     }
  60.     return false;
  61.   }
  62.  
  63. int dtalktounix(B,A_0,A_1)    /* talktounix */
  64. register AFFIX B,A_0,A_1;
  65. {
  66.     int connection = atoi (B->t);
  67.     FILE *in = Unix_in[connection];
  68.     FILE *out = Unix_out[connection];
  69.     if (UnixConnectionSetUp[connection] && !feof(in)) {
  70.       register char *rc =c;
  71.       A_1 ->t = rc;
  72.       A_1 ->l = nil;
  73.       A_1 ->r = nil;
  74.       printa(out, A_0);
  75.       fflush(out);
  76.       --rc;
  77.       do {
  78.         *++rc = getc(in) ;
  79.         if  (*rc == '\\') {
  80.           *++rc = getc(in) ;
  81.           if (*rc == '\n') *--rc = getc(in) ;
  82.         }
  83.  
  84.       } while  ((*rc != '\n') && (!feof(in)));
  85.     *rc++ = '\0';
  86.     c = rc;
  87.   if (rc > cstore_top ) cstore_overflow();
  88.     return true;
  89.   }
  90.   return false;  
  91. }
  92.  
  93.  
  94. int talkto(cmd)
  95. char    *cmd;
  96. {
  97.   int to_child[2], to_parent[2], pid, cnt = 1;
  98.   char *args = cmd;
  99.  
  100.   pipe(to_child);
  101.   pipe(to_parent);
  102.  
  103.   argv[0] = cmd;
  104.  
  105.   while (*args++ != '\0') {
  106.     if (*args == ' ')  {
  107.       *args = '\0';
  108.       while (*++args == ' ') ;
  109.       argv[cnt++] = args;
  110.       if (cnt == 10) {
  111.         fprintf(stderr,"set up connection to unix: too much args (>9)\n");
  112.         return false;
  113.       }
  114.     }
  115.   }
  116.   argv[cnt] = NULL;
  117.  
  118.  
  119.   if (pid = vfork(), pid == 0) {
  120.     int err = 0;
  121.  
  122.     close(0);
  123.     dup(to_child[0]);
  124.     close (1);
  125.     dup(to_parent[1]);
  126.     close(to_child[0]);
  127.     close(to_child[1]);
  128.     close(to_parent[1]);
  129.     close(to_parent[0]);
  130.     err = execvp(cmd, argv);
  131.     fprintf (stderr,"execvp: (%d) No such command %s\n", err,cmd);
  132.     exit(1); 
  133.   } else if (pid > 0) {  /* in the parent */
  134.  
  135.     Unix_in[connection_count] = fdopen(to_parent[0],"r");
  136.     Unix_out[connection_count] = fdopen(to_child[1],"w");
  137.  
  138.     if (Unix_in[connection_count] == NULL) 
  139.       return false;
  140.     close(to_child[0]);
  141.     close(to_parent[1]);
  142.  
  143.  
  144.   } else {
  145.     fprintf (stderr, "Couldnt fork process %s\n", cmd);
  146.     return false;
  147.   }
  148.   return true;
  149. }
  150.  
  151. int dgetfromunix(A_0,A_1)    
  152. register AFFIX A_1;
  153. register AFFIX A_0;
  154. {
  155.     char    *A;
  156.     register char *rc;
  157.       EVAL(A_0, A);
  158.       if (talkto(A))
  159.       {
  160.          FILE *in = Unix_in[connection_count];
  161.          FILE *out = Unix_out[connection_count];
  162.          rc = c;
  163.          A_1 ->t = rc;
  164.          A_1 ->l = nil;
  165.          A_1 ->r = nil;
  166.          while  (!feof(in))
  167.            *rc++ = getc(in) ;
  168.         *(rc-1) = '\0';
  169.         c = rc;
  170.   if (rc > cstore_top ) cstore_overflow();
  171.         fclose (in);
  172.         fclose (out);
  173.         return true;
  174.     }
  175.     return false;
  176. }
  177. #endif
  178.  
  179. #ifdef UUNIXCON
  180. void usetupconnectiontounix () 
  181.    register cont *rq = q;
  182. register AFFIX A_1 = rq->a;
  183. register AFFIX A_0 = (rq -1) ->a;
  184.    char *rc = c; 
  185.    if ( dsetupconnectiontounix (A_0,A_1)) {
  186.       q = rq -3;
  187.       (*(rq -2)->q)(); 
  188.       rq = q +2;
  189.    }
  190.    (rq -1) ->a = A_0;
  191.    rq->a = A_1;
  192.    (rq + 1)->q = usetupconnectiontounix; 
  193.    q = rq + 1; 
  194.    c = rc;
  195. }
  196.  
  197. void utalktounix () 
  198.    register cont *rq = q;
  199. register AFFIX A_2 = rq->a;
  200. register AFFIX A_1 = (rq -1)->a;
  201. register AFFIX A_0 = (rq -2)->a;
  202.    char *rc = c; 
  203.    if ( dtalktounix (A_0, A_1,A_2)) {
  204.       q = rq -4;
  205.       (*(rq -3)->q)(); 
  206.       rq = q +3;
  207.    }
  208.    (rq -2)->a = A_0;
  209.    (rq -1)->a = A_1;
  210.    rq->a = A_2;
  211.    (rq + 1)->q = utalktounix; 
  212.    q = rq + 1; 
  213.    c = rc;
  214. }
  215.  
  216. void ugetfromunix ()
  217. {
  218.    register cont *rq = q;
  219. register AFFIX A_1 = rq->a;
  220. register AFFIX A_0 = (rq -1)->a;
  221.    char *rc = c; 
  222.    if ( dgetfromunix (A_0, A_1)) {
  223.       q = rq -3;
  224.       (*(rq -2)->q)();
  225.       rq = q +2;
  226.    }
  227.    (rq -1)->a = A_0;
  228.    rq->a = A_1;
  229.    (rq + 1)->q = ugetfromunix;
  230.    q = rq + 1;
  231.    c = rc;
  232. }
  233. #endif
  234.